#pragma once

#include <mysql/mysql.h>
#include <string>
#include <memory>
#include <vector>
#include "../models/user.hpp"

/**
 * @brief MySQL数据库管理类，使用单例模式
 * 
 * 该类负责处理与MySQL数据库的所有交互，包括：
 * - 数据库连接管理
 * - 用户相关的CRUD操作
 * - SQL注入防护
 * - 错误处理和日志记录
 */
class MySQLManager {
public:
    /**
     * @brief 获取MySQLManager单例实例
     * @return MySQLManager& 数据库管理器的单例引用
     */
    static MySQLManager& getInstance();

    /**
     * @brief 初始化数据库连接
     * @return bool 连接是否成功
     */
    bool init();

    /**
     * @brief 清理数据库连接
     */
    void cleanup();

    // User operations
    /**
     * @brief 创建新用户
     * @param username 用户名
     * @param password 密码
     * @param email 电子邮件
     * @return bool 创建是否成功
     */
    bool createUser(const std::string& username, const std::string& password, const std::string& email);

    /**
     * @brief 根据用户名获取用户信息
     * @param username 用户名
     * @return std::shared_ptr<User> 用户对象指针，如果用户不存在则返回nullptr
     */
    std::shared_ptr<User> getUserByUsername(const std::string& username);

    /**
     * @brief 验证用户登录凭证
     * @param username 用户名
     * @param password 密码
     * @return bool 验证是否成功
     */
    bool validateUserCredentials(const std::string& username, const std::string& password);

    /**
     * @brief 更新用户最后登录时间
     * @param userId 用户ID
     * @return bool 更新是否成功
     */
    bool updateUserLastLogin(int userId);

private:
    // 私有构造函数，防止外部实例化
    MySQLManager() = default;
    ~MySQLManager();
    // 删除拷贝构造和赋值操作符，确保单例
    MySQLManager(const MySQLManager&) = delete;
    MySQLManager& operator=(const MySQLManager&) = delete;

    MYSQL* conn_ = nullptr;      ///< MySQL连接句柄
    bool connected_ = false;     ///< 连接状态标志

    /**
     * @brief 转义SQL字符串，防止SQL注入
     * @param str 需要转义的字符串
     * @return std::string 转义后的字符串
     */
    std::string escapeString(const std::string& str);
}; 